/*
 * @Author: soso
 * @Date: 2022-02-10 17:38:34
 * @LastEditTime: 2022-02-17 15:44:27
 * @LastEditors: soso
 * @Description: 文件掩码处理（基于bitmap 位图）
 * @FilePath: /go-mesh-sync/core/cfiles/filemask.go
 */

package cfiles

import (
	"io/ioutil"
	"os"

	"gitee.com/kimsoso/go-utils/bitmap"
)

type FileMask struct {
	bm *bitmap.BitMap
}

// 新建文件掩码
func NewFileMask(blocksCount uint32) FileMask {
	return FileMask{
		bm: bitmap.NewBitMap(blocksCount),
	}
}

// 新建文件掩码从数据
func NewFileMaskFromBuf(buf []byte) (fm FileMask, err error) {
	bm := bitmap.NewEmptyBitMap()
	err = bm.UnSerialize(buf)
	if err != nil {
		return
	}
	return FileMask{
		bm: bm,
	}, nil
}

// 新建文件掩码从文件
func NewFileMaskFromFile(realFilePath string) (fm FileMask, err error) {
	buf, err := ioutil.ReadFile(realFilePath)
	if err != nil {
		return
	}

	return NewFileMaskFromBuf(buf)
}

// 设置位
func (fm FileMask) SetBit(pos uint) {
	fm.bm.Add(pos)
}

// 是否全空
func (fm FileMask) IsEmpty() bool {
	return fm.bm.IsEmpty()
}

// 是否全位设置
func (fm FileMask) IsFull() bool {
	return fm.bm.IsFull()
}

// 位检查
func (fm FileMask) BitExist(pos uint) bool {
	return fm.bm.IsExist(pos)
}

// 序列化
func (fm FileMask) Serialize() []byte {
	return fm.bm.Serialize()
}

// 存入文件
func (fm FileMask) ToFile(realFilePath string) error {
	buf := fm.bm.Serialize()
	return ioutil.WriteFile(realFilePath, buf, os.ModePerm)
}
